package com.td.filemanager.business.filetype;

import com.td.filemanager.MyApplication;
import com.td.library.config.FileType;
import com.td.library.data.DeviceData;
import com.td.library.data.FileTypeData;
import com.td.library.utils.LogUtil;
import com.td.lib.viewmodel.ViewModel;
import ohos.aafwk.abilityjet.activedata.ActiveData;
import ohos.app.dispatcher.task.TaskPriority;

import java.io.File;
import java.util.*;
import java.util.stream.Collectors;

/**
 * 文件类型ViewModel
 */
public class FileTypeViewModel extends ViewModel {
    private static final String TAG = FileTypeViewModel.class.getSimpleName();

    private ActiveData<List<FileTypeData>> mFileTypeData = new ActiveData<>();
    private ActiveData<Boolean> mSelectAll = new ActiveData<>();

    private String mParentFilePath;
    private List<DeviceData> mSelectDeviceData;

    public FileTypeViewModel() {
    }

    /**
     * 设置父路径
     *
     * @param parentFilePath 设置父路径
     */
    public void setParentFilePath(String parentFilePath) {
        mParentFilePath = parentFilePath;
    }

    /**
     * 获取文件类型数据
     *
     * @return 文件类型数据
     */
    public ActiveData<List<FileTypeData>> getFileTypeData() {
        return mFileTypeData;
    }

    /**
     * 设置所选设备数据
     *
     * @param selectDeviceData 所选设备数据
     */
    public void setSelectDeviceData(List<DeviceData> selectDeviceData) {
        this.mSelectDeviceData = selectDeviceData;
        LogUtil.info(TAG, "FileTypeViewModel setDeviceDatas " + selectDeviceData);
    }

    /**
     * 获取ActiveData
     *
     * @return ActiveData
     */
    public ActiveData<Boolean> getSelectAll() {
        return mSelectAll;
    }

    /**
     * 获取已选数据
     *
     * @return 已选数据
     */
    public List<DeviceData> getSelectDeviceData() {
        return mSelectDeviceData;
    }

    /**
     * 刷新数据
     */
    public void refresh() {
        List<FileTypeData> list = initFileTypeData();
        initDevicesFileTypeNumber(list);
    }

    private List<FileTypeData> initFileTypeData() {
        List<FileTypeData> list = mFileTypeData.getData();
        if (list == null) {
            list = Arrays.stream(FileType.values())
                    .filter(fileType -> !fileType.equals(FileType.FILE))
                    .map(fileType -> {
                        return new FileTypeData(fileType, false, 0);
                    }).collect(Collectors.toList());
        }
        list.forEach(fileTypeData -> {
            fileTypeData.setNumber(0);
        });
        return list;
    }

    private void initDevicesFileTypeNumber(List<FileTypeData> list) {
        MyApplication.getInstance().getGlobalTaskDispatcher(TaskPriority.DEFAULT)
                .asyncDispatch(() -> {
                    mSelectDeviceData.forEach(device -> {
                        initFileTypeNumber(list, device);
                    });
                    MyApplication.getInstance().getUITaskDispatcher().asyncDispatch(() -> {
                        LogUtil.info(TAG, "FileTypeData " + list);
                        mFileTypeData.setData(list);
                    });
                });
    }

    private void initFileTypeNumber(List<FileTypeData> list, DeviceData deviceData) {
        File deviceFileParent = new File(mParentFilePath, deviceData.getDeviceId());
        if (!deviceFileParent.exists()) {
            LogUtil.info(TAG, "file " + mParentFilePath + File.pathSeparator + deviceData.getDeviceId() + " not exists");
            return;
        }

        for (File file : deviceFileParent.listFiles()) {
            if (!file.isDirectory()) {
                continue;
            }
            String name = file.getName();
            for (FileTypeData fileTypeData : list) {
                if (fileTypeData.getFileType().getFileDirectoryName().equals(name)
                    && new File(deviceFileParent, name).exists()) {
                    File typeFileParent = new File(deviceFileParent, name);
                    fileTypeData.setNumber(fileTypeData.getNumber() + typeFileParent.list().length);
                    break;
                }
            }
        }
    }

    /**
     * 是否全部选取
     *
     * @return 是否全部选取
     */
    public boolean isAllItemSelected() {
        return mFileTypeData.getData().stream().allMatch(FileTypeData::isChecked);
    }

    /**
     * 是否全部取消选取
     *
     * @return 是否全部取消选取
     */
    public boolean isAllItemUnSelected() {
        return mFileTypeData.getData().stream().noneMatch(FileTypeData::isChecked);
    }

    /**
     * 获取所选设备
     *
     * @return 所选设备
     */
    public List<DeviceData> getSelectedDevices() {
        return mSelectDeviceData;
    }

    /**
     * 获取所选文件类型
     *
     * @return 文件类型
     */
    public List<FileTypeData> getSelectedFileTypes() {
        return mFileTypeData.getData().stream()
                .filter(FileTypeData::isChecked)
                .collect(Collectors.toList());
    }
}
